package IO;

import java.io.File;
import java.io.IOException;
import java.net.URL;
//import java.net.URL;

public class 读取classpath {

	public static void main(String[] args) throws IOException {
		System.out.println(System.getProperty("java.class.path"));
		System.out.println(System.getProperty("user.dir"));
		//使用相对路径(不以/开头)，那么根目录设定为这个类的class文件所在的目录下
		System.out.println(ClassLoader.getSystemResource(""));
		System.out.println(new File(".").getCanonicalPath());
		System.out.println(new File(".").getAbsolutePath());
		System.out.println(ClassLoader.getSystemResource(""));
				//.class.getResource(""));
      System.out.println(读取classpath.class.getResource(""));
      //使用绝对路径(以/开头)，那么根目录设定为这个类的顶级package下. 
      //比如说A.class的路径为App/classes/package1/package2/A.class, 那么跟目录就设定为App/classes/
      System.out.println(读取classpath.class.getResource("/"));
      System.out.println(读取classpath.class.getClassLoader().getResource(""));
      
      //获取当前类（class 字节码文件）绝对路径
      //我们来获取 myJdkDynamic 项目中，Test.class 的绝对路径：
      //这里可以通过 URL 类来获取
//      两种方式：
//      类名.class.getClassLoader().getResource(“文件名”).getPath();
//      类名.class.getResource("/文件名").getPath();
//ring path = 读取classpath.class.getClassLoader().getResource("尾递归.java").getPath();
      URL url =读取classpath.class.getClassLoader().getResource("");
String path = url.getPath();
      // absolutePath = resource.getPath();
      System.out.println("====="+path);
      //我们现在已经有当前类所在目录的 File 对象了，如果我们要进一步，拿到某个 .class 文件的 File 对象，比如上面的 Test.class，
      //可以这样做：
      // public File(File parent, String child)
//      File classFile = new File(absolutePath, "尾递归.java");
//      File classFile = new File(absolutePath, "读取classpath.class");
//
      File file = new File(path,"尾递归.java");
//      System.out.println(classFile.getAbsolutePath());
      System.out.println(file.exists());
      System.out.println("com.yzh.test".replaceAll("\\.", "/"));//com//yzh/test
      
	}

}
/*
扫描指定包，得到指定包下所有类的全类名（本质是文件操作）大致步骤如下：

1.获取 scanPackage 的绝对路径，因为构建 File 的入参不能是包名（比如 com.yzh.test）
2.创建需要扫描包（目录）的 File 对象
3.递归遍历当前目录
private List<String> classNames = new ArrayList<String>();

// 入参 scanPackage 比如 com.yzh.test
private void doScanner(String scanPackage) {

    // getResource 获取绝对路径，首先要将包名转化成项目相对路径
    // 由于是包名，是相对于项目根目录而言的，所以在转化为 / 后还需要在最前面加上 /
    URL url = this.getClass().getClassLoader().getResource("/" + scanPackage.replaceAll("\\.", "/"));//将com.yzh.test换成com/yzh/test
    File classpath = new File(url.getFile()); // getFile 拿到绝对路径

    // 遍历文件夹，寻找class文件
    for (File file : classpath.listFiles()) {
        if (file.isDirectory()) {
            // 这里是通过递归遍历文件夹，还是包就再执行上述步骤（解析路径->创建目录->遍历）
            doScanner(scanPackage + "." + file.getName());
        } else {
            // 不是class文件的不管
            if (!file.getName().endsWith("class")) {continue;}
            // 这里要保存全类名（包.类名），因为后面要通过反射Class.forName获取Class对象
            String className = (scanPackage + "." + file.getName()).replace(".class", "");
            classNames.add(className);
        }
    }
}
 */


/*
System.getProperty()参数大全 
# java.version                                Java Runtime Environment version  
# java.vendor                                Java Runtime Environment vendor  
# java.vendor.url                           Java vendor URL  
# java.home                                Java installation directory  
# java.vm.specification.version   Java Virtual Machine specification version  
# java.vm.specification.vendor    Java Virtual Machine specification vendor  
# java.vm.specification.name      Java Virtual Machine specification name  
# java.vm.version                        Java Virtual Machine implementation version  
# java.vm.vendor                        Java Virtual Machine implementation vendor  
# java.vm.name                        Java Virtual Machine implementation name  
# java.specification.version        Java Runtime Environment specification version  
# java.specification.vendor         Java Runtime Environment specification vendor  
# java.specification.name           Java Runtime Environment specification name  
# java.class.version                    Java class format version number  
# java.class.path                      Java class path  
# java.library.path                 List of paths to search when loading libraries  
# java.io.tmpdir                       Default temp file path  
# java.compiler                       Name of JIT compiler to use  
# java.ext.dirs                       Path of extension directory or directories  
# os.name                              Operating system name  
# os.arch                                  Operating system architecture  
# os.version                       Operating system version  
# file.separator                         File separator ("/" on UNIX)  
# path.separator                  Path separator (":" on UNIX)  
# line.separator                       Line separator ("/n" on UNIX)  
# user.name                        User’s account name  
# user.home                              User’s home directory  
# user.dir                               User’s current working directory
*/